package com.ruoyi.framework.handler;


import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.http.HttpStatus;

import java.time.LocalDateTime;
import java.util.Date;

/**
 * MP注入处理器
 *
 * @author Lion Li
 * @date 2021/4/25
 */
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        try {
            if (ObjectUtil.isNotNull(metaObject)) {
                if (metaObject.getOriginalObject() instanceof BaseEntity) {
                    BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();
                    Date current = ObjectUtil.isNotNull(baseEntity.getCreateTime())
                            ? baseEntity.getCreateTime() : new Date();
                    baseEntity.setCreateTime(current);
                    baseEntity.setUpdateTime(current);
                    String username = StringUtils.isNotBlank(baseEntity.getCreateBy())
                            ? baseEntity.getCreateBy() : SecurityUtils.getUsername();
                    // 当前已登录 且 创建人为空 则填充
                    baseEntity.setCreateBy(username);
                    // 当前已登录 且 更新人为空 则填充
                    baseEntity.setUpdateBy(username);
                } else {
                    Long userId ;
                    try {
                        userId= SecurityUtils.getUserId();;
                    }catch (Exception e){
                        userId= 1000L;
                    }
                    this.setFieldValByName("createUser", userId, metaObject);
                    this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
                    this.setFieldValByName("updateUser", userId, metaObject);
                    // 修改更新时间时，如果以指定则不修改
                    this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
                    this.setFieldValByName("deleted","0", metaObject);

                }

            }
        } catch (Exception e) {
            throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.UNAUTHORIZED.value());
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        try {
            if (ObjectUtil.isNotNull(metaObject)) {
                if (metaObject.getOriginalObject() instanceof BaseEntity) {
                    BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();

                    // 更新时间填充(不管为不为空)
                    baseEntity.setUpdateTime(new Date());
                    String username = SecurityUtils.getUsername();
                    // 当前已登录 更新人填充(不管为不为空)
                    if (StringUtils.isNotBlank(username)) {
                        baseEntity.setUpdateBy(username);
                    }
                } else {
                    this.setFieldValByName("updateUser", SecurityUtils.getUserId(), metaObject);
                    // 修改更新时间时，如果以指定则不修改
                    this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
                }

            }
        } catch (Exception e) {
            throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.UNAUTHORIZED.value());
        }
    }
}
